home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 November / Macworld (1999-11).dmg / Updaters / WhiteCap 3.0.4 / WhiteCap Source.sit / WhiteCap Source / mainMacAMP.cpp < prev    next >
C/C++ Source or Header  |  1999-08-29  |  10KB  |  440 lines

  1.  
  2. #include "CEgFileSpec.h"
  3. #include "MacAMP_Visual.h"
  4. #include "WhiteCap.h"
  5. #include "EgOSUtils.h"
  6. #include <Dialogs.h>
  7. #include <Resources.h>
  8. #include <stdlib.h>
  9. #include <time.h>
  10.  
  11. // This is the gPlugInfo block - a place where MacAmp gets initial information about your plugin.
  12. // Make sure to set the fragment's entry point to gPlugInfo to make it accessible for the MacAmp routines.
  13.  
  14. VPInfoBlock gPlugInfo =
  15. {
  16.     VP_INFOBLOCK_HEADER( cPluginAuthor, cWhiteCapID),
  17.  
  18.     "\pWhiteCap",
  19.  
  20.     VisInitialize,
  21.     VisTerminate,
  22.     nil,                // we don't idle
  23.     VisAbout,
  24.     VisDraw,
  25.     nil,
  26.     
  27.     nil,            // we don't want keydowns..
  28.     VisMacEvent,        // ...and events
  29.     
  30.     nil,
  31.     nil,                // we have no settings
  32.     nil,
  33.     nil,
  34.     
  35.     // Nifty macro to set all these 'reserved' values for us
  36.     VP_INFOBLOCK_FOOTER
  37. };
  38.  
  39.  
  40.  
  41.  
  42. // These are globals.
  43. static WhiteCap*        gWC = NULL;
  44. static float            gSample[ NUM_SAMPLE_BINS ];
  45. static short            gRefNum = -1;
  46. static double            gDummyFFT[ NUM_SAMPLE_BINS ];
  47.  
  48.  
  49.  
  50. /* 
  51.     PlugInitialize
  52.  
  53.     Called every time use selects your plugin from the Plugins menu. You need to allocate and display a window here,
  54.     init your variables, and do whatever you want, like set the refnum if you need it.
  55.     
  56.     This function uses FSSpec to itself that MacAmp provides to it to gain access to its resource fork.
  57.     
  58.     Other than that, everything is hard-coded and is definitly not an example of good programming =P
  59. */
  60. OSStatus    VisInitialize(FSSpecPtr inPlugin, WindowPtr* outWindow, UInt32* ) {
  61.     
  62.     gRefNum = ::FSpOpenResFile( inPlugin, fsRdPerm );
  63.  
  64.     EgOSUtils::Initialize();
  65.     PixPort::Startup();
  66.         
  67.         
  68.     Rect r = { 0, 0, 0, 0 };
  69.     *outWindow = ::NewCWindow( NULL, &r, "\pWhiteCap", false, 1985, (WindowPtr)-1, true, NULL );
  70.     CEgFileSpec folder;
  71.     folder.AssignFolder( "WhiteCap Configs" );
  72.     
  73.     
  74.     gWC = new WhiteCap( folder );
  75.     gWC -> SetWinPort( *outWindow );
  76.  
  77.     
  78.     // Update the window
  79.     gWC -> Draw();
  80.  
  81.     return noErr;
  82. }
  83.  
  84.  
  85. /* 
  86.     PlugTerminate
  87.  
  88.     Called when user deselects your plugin, MacAmp quits or in the case if you have passed visTerminate/visNoMemory error.
  89.     You should dispose your window here & clean up the mess.
  90. */
  91. OSStatus    VisTerminate(WindowPtr inWin, UInt32*)
  92. {
  93.  
  94.     delete gWC;
  95.     gWC = NULL;
  96.  
  97.  
  98.     ::DisposeWindow( inWin );
  99.     
  100.     PixPort::Shutdown();
  101.  
  102.         
  103.     // Close our resource fork.
  104.     if ( gRefNum != -1 )
  105.         ::FSClose( gRefNum );
  106.     
  107.     return noErr;
  108. }
  109.  
  110.  
  111.  
  112. OSStatus VisDraw(WindowPtr, UInt32*) { 
  113.  
  114.     
  115.     // If we detext a click in fullscreen, then exit fullscreen mode no matter what
  116.     if ( gWC -> IsFullScreen() ) {
  117.         if ( ::Button() )
  118.             gWC -> SetFullScreen( false ); 
  119.     }
  120.     
  121.     
  122.     int i, j, bin;
  123.     unsigned long time, status = 0;
  124.     unsigned short fftNum;
  125.     double* samp;
  126.     float scale = .12 * UNIV_MAG_SCALE;
  127.     
  128.  
  129.     gPlugInfo.ma->GetFFT( &samp, &fftNum );
  130.  
  131.     if ( gPlugInfo.ma->GetStatus )
  132.         gPlugInfo.ma->GetStatus( &time, &status );
  133.  
  134.     if ( fftNum < NUM_SAMPLE_BINS * 11 + 10 || ( status & statusStopped ) ) {
  135.         for ( i = 0; i < NUM_SAMPLE_BINS; i++ ) {
  136.             gSample[ i ] = 0; 
  137.         } }
  138.     else {
  139.     
  140.         bin = 10;
  141.         for ( i = 0; i < NUM_SAMPLE_BINS; i++ ) {
  142.             gSample[ i ] = 0;
  143.             for ( j = 0; j < 8; j++, bin++ ) 
  144.                 gSample[ i ] += samp[ bin ];
  145.         }
  146.         
  147.         bin = 10;
  148.         for ( i = 0; i < NUM_SAMPLE_BINS; i++ ) {
  149.             for ( j = 0; j < 8; j++, bin++ ) 
  150.                 gSample[ i ] += samp[ bin ];
  151. //            gSample[ i ] = .03 * .0003 * gSample[ i ] * (0.85 + .059 * i);
  152. //            gSample[ i ] = .1 * ( sqrt( 15 + .0003 * gSample[ i ] * (0.85 + .059 * i) ) - sqrt( 15 ) );
  153.  
  154.             gSample[ i ] = scale * ( sqrt( 40 + .00042 * gSample[ i ] * (0.85 + .051 * i) ) - sqrt( 40 ) );
  155.             
  156.             
  157.             //gSample[ i ] = .000013 * gSample[ i ] * (0.85 + .058 * i);
  158.             //gSample[ i ] = 1 * log( 2 * gSample[ i ] + 1 );
  159.  
  160.             //gSample[ i ] = pow( gSample[ i ], 1.4 );
  161.             //gSample[ i ] = log( 1 + .6 * gSample[ i ] );
  162.  
  163.         }
  164.         
  165.         gSample[ 0 ] *= 0.45;
  166.         gSample[ 1 ] *= 0.75;
  167.         
  168.         //gSample[ 4 ] = 1;
  169.     }
  170.  
  171.     // Store the newest sample and chuck and old samples
  172.     gWC -> RecordSample( EgOSUtils::CurTimeMS(), gSample );
  173.  
  174.     // Update the screen, baby.  Let's shag!
  175.     gWC -> Draw();
  176.  
  177.     return noErr;
  178.  
  179. }
  180.  
  181.  
  182. /*
  183. OSStatus VisClick( WindowPtr inWindow, Point inPt, UInt32* ) {
  184.  
  185.     static long sLastWhen = 0;
  186.     long     curTime = ::TickCount();
  187.     bool    doSelect = false;
  188.     bool    button = ::Button();
  189.  
  190.     // see if the cmd key is down
  191.     if ( button ) {
  192.         unsigned char km[16];
  193.         ::GetKeys( (unsigned long*) km );
  194.         long code = 55;     // Cmd key code
  195.         if ( ((km[ code >> 3 ] >> (code & 7)) & 1) != 0 ) {
  196.             doSelect = true;
  197.         }
  198.     }
  199.     
  200.     if ( gWC -> PtInTitle( inPt ) || doSelect )
  201.         gWC -> SelectConfig();
  202.     else if ( curTime - sLastWhen < ::GetDblTime() ) 
  203.         gWC -> SetFullScreen( true );
  204.     else if ( ! gWC -> IsFullScreen() ) {
  205.         if ( button ) {
  206.             Rect r, growBox, lim;
  207.             gWC -> GetWinRect( r );
  208.             growBox = r;
  209.             growBox.left = r.right - 30;
  210.             growBox.top = r.bottom - 30;
  211.             if ( ::PtInRect( inPt, &growBox ) ) {
  212.                 lim.top = lim.left = 30;
  213.                 lim.bottom = lim.right = 9000;
  214.                 unsigned long newSize = ::GrowWindow( inWindow, inPt, &lim );
  215.                 ::SizeWindow( inWindow, newSize & 0xFFFF, newSize >> 16, false );
  216.                 gWC -> GetWinRect( r );
  217.                 gWC -> SetWinPort( inWindow, &r );        // SizeWindow changes the size of the win, but gWC doesn't know that
  218.             }
  219.         }
  220.         sLastWhen = curTime;
  221.     }
  222.  
  223.     return noErr;
  224. }
  225. */
  226.  
  227.  
  228. OSStatus VisMacEvent(WindowPtr inWindow, EventRecord* inEvt, UInt32* ) {
  229.     static long sLastWhen = 0;
  230.     long     curTime = ::TickCount();
  231.     Point inPt = inEvt -> where;
  232.         
  233.     switch ( inEvt -> what ) {
  234.         case updateEvt:    
  235.             ::BeginUpdate( inWindow );
  236.             gWC -> RefreshRect( (**( inWindow -> visRgn)).rgnBBox );
  237.             ::EndUpdate( inWindow );
  238.             gWC -> Draw(); 
  239.             break;
  240.             
  241.         
  242.         case mouseDown:    
  243.             if ( gWC -> PtInTitle( inPt ) || ( inEvt -> modifiers & cmdKey ) )
  244.                 gWC -> SelectConfig();
  245.             else if ( gWC -> IsFullScreen() )
  246.                 gWC -> SetFullScreen( false );
  247.             else if ( curTime - sLastWhen < ::GetDblTime() ) 
  248.                 gWC -> SetFullScreen( true );
  249.             else if ( ! gWC -> IsFullScreen() ) {
  250.                 if ( true ) {
  251.                     Rect r, growBox, lim;
  252.                     gWC -> GetWinRect( r );
  253.                     growBox = r;
  254.                     growBox.left = r.right - 30;
  255.                     growBox.top = r.bottom - 30;
  256.                     if ( ::PtInRect( inPt, &growBox ) ) {
  257.                         lim.top = lim.left = 30;
  258.                         lim.bottom = lim.right = 9000;
  259.                         unsigned long newSize = ::GrowWindow( inWindow, inPt, &lim );
  260.                         ::SizeWindow( inWindow, newSize & 0xFFFF, newSize >> 16, false );
  261.                         gWC -> GetWinRect( r );
  262.                         gWC -> SetWinPort( inWindow, &r );        // SizeWindow changes the size of the win, but gWC doesn't know that
  263.                     }
  264.                 }
  265.                 sLastWhen = curTime;
  266.             }
  267.             break;
  268.     }
  269.  
  270.  
  271.     return noErr;
  272. }
  273.  
  274.  
  275.  
  276.  
  277.  
  278. OSStatus    VisAbout(WindowPtr, UInt32*)
  279. {
  280.     ::NoteAlert( 556, nil );
  281.     return noErr;
  282. }
  283.  
  284.  
  285.  
  286.  
  287.  
  288.  
  289. /* 
  290.     PlugSettings
  291.  
  292.     Called when user selects your plugin from the Settings submenu. Only used if you have declared that
  293.     you support settings (flagHasSettings is set).
  294.     
  295.     You should display the settings dialog here, or do whateverr you feel like. =) Just remember that when user
  296.     chooses settings (s)he expects some interactino with the plugin, like the dialog or like that.
  297. */
  298. OSStatus VisSettings(WindowPtr inWindow, UInt32* ioRefcon) {
  299.  
  300. #pragma unused (inWindow, ioRefcon)
  301.     return noErr;
  302. }
  303.  
  304.  
  305.  
  306.  
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  
  313. #ifdef MACAMP
  314.  
  315. /* 
  316.  
  317. *****  Everything below here is for a project that runs on its own.  
  318.  
  319. Essential when you need to debug, etc
  320. -ACO 1/14/99
  321.  
  322. */
  323.  
  324. #include <Types.h>
  325. #include <Memory.h>
  326. #include <Quickdraw.h>
  327. #include <Fonts.h>
  328. #include <Events.h>
  329. #include <Menus.h>
  330. #include <Windows.h>
  331. #include <TextEdit.h>
  332. #include <Dialogs.h>
  333. #include <OSUtils.h>
  334. #include <ToolUtils.h>
  335. #include <SegLoad.h>
  336. #include <Sound.h>
  337.  
  338.     
  339. /* Prototypes */
  340. void Initialize(void);
  341.  
  342. // 
  343. //    Main body of program SillyBalls
  344. //
  345. #include "Expression.h"
  346. #include "Hashtable.h"
  347.  
  348.  
  349.  
  350.  
  351. void dummyGetFFT( double** outFFT, UInt16* outFFTSize );
  352.  
  353. void dummyGetFFT( double** outFFT, UInt16* outFFTSize ) {
  354.     *outFFT = gDummyFFT;
  355.     *outFFTSize = 0;
  356. }
  357.  
  358. //MW specified argument and return type.
  359. int main(void)
  360. {
  361.     GrafPort win;
  362.     WindowPtr winP = &win;
  363.     unsigned long    num, N = NUM_SAMPLE_BINS;
  364.     FSSpec spec;
  365.  
  366.     for ( num = 0; num < N; num++ )
  367.         gDummyFFT[ num ] = 0;
  368.     
  369.     Initialize();
  370.     gPlugInfo.ma = new VPCallbacks;
  371.     gPlugInfo.ma -> GetFFT = dummyGetFFT;
  372.     gPlugInfo.ma -> GetStatus = NULL; 
  373.     gPlugInfo.ma -> EnterFullScreen = NULL;
  374.     gPlugInfo.ma -> ExitFullScreen = NULL;
  375.     
  376.     VisInitialize( &spec, &winP, &num );
  377.  
  378.     
  379.     do {
  380.         VisDraw( winP, &num );
  381.         long n = EgOSUtils::Rnd( 0, N-1 );
  382.         gDummyFFT[ n ] += .011 * EgOSUtils::Rnd( 0, 100 );
  383.         for ( num = 0; num < N; num++ ) {
  384.             gDummyFFT[ num ] = .8 * gDummyFFT[ num ];
  385.         }
  386.     } while (!Button());
  387.  
  388.     VisTerminate( winP, &num );
  389.     
  390.     delete gPlugInfo.ma;
  391.     
  392.     return 0;    
  393. }
  394.  
  395.  
  396. // 
  397. //    Initialize everything for the program, make sure we can run
  398. //
  399.  
  400. //MW specified argument and return type.
  401. void Initialize(void)
  402. {
  403.     OSErr        error;
  404.     SysEnvRec    theWorld;
  405.         
  406.     //
  407.     //    Test the computer to be sure we can do color.  
  408.     //    If not we would crash, which would be bad.  
  409.     //    If we can’t run, just beep and exit.
  410.     //
  411.  
  412.     error = SysEnvirons(1, &theWorld);
  413.     if (theWorld.hasColorQD == false) {
  414.         SysBeep(50);
  415.         ExitToShell();                    /* If no color QD, we must leave. */
  416.     }
  417.     
  418.     /* Initialize all the needed managers. */
  419.     InitGraf(&qd.thePort);
  420.     InitFonts();
  421.     InitWindows();
  422.     InitMenus();
  423.     TEInit();
  424.     InitDialogs(nil);
  425.     InitCursor();
  426.  
  427.     //
  428.     //    To make the Random sequences truly random, we need to make the seed start
  429.     //    at a different number.  An easy way to do this is to put the current time
  430.     //    and date into the seed.  Since it is always incrementing the starting seed
  431.     //    will always be different.  Don’t for each call of Random, or the sequence
  432.     //    will no longer be random.  Only needed once, here in the init.
  433.     //
  434.     GetDateTime((unsigned long*) &qd.randSeed);
  435.  
  436. }
  437.  
  438.  
  439. #endif
  440.